CM3D2 Converter.compat

  1# -*- coding: utf-8 -*-
  2import bpy
  3import bpy_extras
  4import re
  5import struct
  6import os
  7import mathutils
  8import traceback
  9import numpy as np
 10from typing import Any, Optional
 11
 12
 13# LEGAY: version less than 2.80
 14IS_LEGACY = not hasattr(bpy.app, 'version') or bpy.app.version < (2, 80)
 15
 16class BlRegister():
 17    idnames = set()
 18    classes = []
 19
 20    def __init__(self, *args, **kwargs):
 21        self.make_annotation = kwargs.get('make_annotation', True)
 22        self.use_bl_attr = kwargs.get('use_bl_attr', True)
 23        self.only_legacy = kwargs.get('only_legacy', False)
 24        self.only_latest = kwargs.get('only_latest', False)
 25
 26    def __call__(self, cls):
 27
 28        if hasattr(cls, 'bl_idname'):
 29            bl_idname = cls.bl_idname
 30        else:
 31            if self.use_bl_attr:
 32                bl_ctx = getattr(cls, 'bl_context', '')
 33                bl_idname = f'{cls.bl_space_type}{cls.bl_region_type}{bl_ctx}{cls.bl_label}'
 34            else:
 35                bl_idname = cls.__qualname__
 36
 37        if self.only_legacy:
 38            if IS_LEGACY:
 39                BlRegister.add(bl_idname, cls)
 40        elif self.only_latest:
 41            if IS_LEGACY is False:
 42                BlRegister.add(bl_idname, cls)
 43        else:
 44            BlRegister.add(bl_idname, cls)
 45
 46        if self.make_annotation:
 47            cls = make_annotations(cls)
 48
 49        if not IS_LEGACY and bpy.app.version >= (2, 93):
 50            cls = make_prop_annotations(cls)
 51
 52        return cls
 53
 54    @classmethod
 55    def add(cls: type, bl_idname: str, op_class: type) -> None:
 56        if bl_idname in cls.idnames:
 57            raise RuntimeError("Duplicate bl_idname: %s" % bl_idname)
 58
 59        cls.idnames.add(bl_idname)
 60        cls.classes.append(op_class)
 61
 62    @classmethod
 63    def register(cls):
 64        for cls1 in cls.classes:
 65            bpy.utils.register_class(cls1)
 66
 67    @classmethod
 68    def unregister(cls):
 69        for cls1 in reversed(cls.classes):
 70            bpy.utils.unregister_class(cls1)
 71
 72    @classmethod
 73    def cleanup(cls):
 74        cls.classes.clear()
 75        cls.idnames.clear()
 76
 77def make_prop_annotations(cls):
 78    if IS_LEGACY:
 79        return cls
 80
 81    prop_type = bpy.props._PropertyDeferred
 82    annotations = cls.__annotations__ if hasattr(cls, "__annotations__") else dict()
 83
 84    for prop_name in dir(cls):
 85        prop = getattr(cls, prop_name)
 86        if type(prop) != prop_type:
 87            continue
 88        annotations[prop_name] = prop
 89    
 90    setattr(cls, "__annotations__", annotations)
 91    #print(cls.__annotations__)
 92    return cls
 93
 94
 95def make_annotations(cls):
 96    if IS_LEGACY:
 97        return cls
 98
 99    cls_props = {}
100    for k, v in cls.__dict__.items():
101        if isinstance(v, tuple):
102            cls_props[k] = v
103
104    annos = cls.__dict__.get('__annotations__')  # type: dict[str, type]
105    if annos is None:
106        annos = {}
107        setattr(cls, '__annotations__', annos)
108
109    for k, v in cls_props.items():
110        annos[k] = v
111        delattr(cls, k)
112
113    # 親クラスを辿ってアノテーションを生成
114    for bc in cls.__bases__:
115        # bpyのタイプやbuiltinsの場合はスキップ
116        if bc.__module__ in ['bpy_types', 'builtins']:
117            continue
118        make_annotations(bc)
119
120    return cls
121
122
123def layout_split(layout, factor=0.0, align=False):
124    if IS_LEGACY:
125        return layout.split(percentage=factor, align=align)
126
127    return layout.split(factor=factor, align=align)
128
129
130def get_active():
131    if IS_LEGACY:
132        return bpy.context.scene.objects.active
133
134    return bpy.context.view_layer.objects.active
135
136def get_active(context):
137    if IS_LEGACY:
138        return context.scene.objects.active
139
140    return context.view_layer.objects.active
141
142
143def set_active(context, obj):
144    if IS_LEGACY:
145        context.scene.objects.active = obj
146    else:
147        context.view_layer.objects.active = obj
148
149
150def get_active_uv(me):
151    if IS_LEGACY:
152        uvs = me.uv_textures
153    else:
154        uvs = me.uv_layers
155    return uvs.active
156
157
158def set_display_type(ob, disp_type):
159    if IS_LEGACY:
160        ob.draw_type = disp_type
161    else:
162        ob.display_type = disp_type
163
164
165def get_select(obj: bpy.types.Object) -> bool:
166    if IS_LEGACY:
167        return obj.select
168
169    return obj.select_get()
170
171
172def set_select(obj: bpy.types.Object, select: bool) -> None:
173    if IS_LEGACY:
174        obj.select = select
175    else:
176        obj.select_set(select)
177
178
179def is_select(*args) -> bool:
180    """すべてが選択状態であるかを判定する."""
181    if IS_LEGACY:
182        return all(arg.select for arg in args)
183
184    return all(arg.select_get() for arg in args)
185
186
187def get_hide(obj: bpy.types.Object) -> bool:
188    if IS_LEGACY:
189        return obj.hide
190
191    return obj.hide_viewport
192
193
194def set_hide(obj: bpy.types.Object, hide: bool):
195    if IS_LEGACY:
196        obj.hide = hide
197
198    else:
199        obj.hide_viewport = hide
200
201
202def link(scene: bpy.types.Scene, obj: bpy.types.Object):
203    if IS_LEGACY:
204        scene.objects.link(obj)
205    elif bpy.context.collection:
206        bpy.context.collection.objects.link(obj)
207    else:
208        scene.collection.objects.link(obj)
209
210
211def unlink(scene: bpy.types.Scene, obj: bpy.types.Object):
212    if IS_LEGACY:
213        scene.objects.unlink(obj)
214    else:
215        for collection in obj.users_collection:
216            collection.objects.unlink(obj)
217
218
219def get_cursor_loc(context):
220    if IS_LEGACY:
221        return context.space_data.cursor_location
222    else:
223        return context.scene.cursor.location
224
225
226def get_lights(blend_data):
227    if IS_LEGACY:
228        return blend_data.iamps
229    else:
230        return blend_data.lights
231
232
233def mul(x, y):
234    if IS_LEGACY:
235        return x * y
236
237    return x @ y
238
239
240def mul3(x, y, z):
241    if IS_LEGACY:
242        return x * y * z
243
244    return x @ y @ z
245
246
247def mul4(w, x, y, z):
248    if IS_LEGACY:
249        return w * x * y * z
250
251    return w @ x @ y @ z
252
253def transform_inverse(m: mathutils.Matrix) -> mathutils.Matrix:
254    """Returns the inverse of a 4x4 transformation matrix
255    with the translation handled properly"""
256    inv_m = m.copy()
257    inv_m.translation = mathutils.Vector((0,0,0))
258    inv_m.invert()
259    inv_m.translation = mul(inv_m.to_3x3(), -m.translation)
260    return inv_m
261
262
263CM_TO_BL_SPACE_MAT4 = mul(
264    bpy_extras.io_utils.axis_conversion(from_forward='Z', from_up='Y', to_forward='-Y', to_up='Z').to_4x4(),
265    mathutils.Matrix.Scale(-1, 4, (1, 0, 0))
266)
267BL_TO_CM_SPACE_MAT4 = CM_TO_BL_SPACE_MAT4.inverted()
268CM_TO_BL_SPACE_QUAT = CM_TO_BL_SPACE_MAT4.to_quaternion()
269BL_TO_CM_SPACE_QUAT = BL_TO_CM_SPACE_MAT4.to_quaternion()
270def convert_cm_to_bl_space(x, lossless=True):
271    if type(x) == mathutils.Quaternion:
272        raise TypeError('Quaternion space conversions not supported')
273    elif lossless and type(x) == mathutils.Vector:
274        return mathutils.Vector((-x.x, -x.z, x.y))
275    else:
276        return mul(CM_TO_BL_SPACE_MAT4, x)
277def convert_bl_to_cm_space(x, lossless=True):
278    if type(x) == mathutils.Quaternion:
279        raise TypeError('Quaternion space conversions not supported')
280    elif lossless and len(x) == 3:
281        return mathutils.Vector((-x[0], x[2], -x[1]))
282    else:
283        return mul(BL_TO_CM_SPACE_MAT4, x)
284def convert_cm_to_bl_local_space(x):
285    if type(x) == mathutils.Quaternion:
286        raise TypeError('Quaternion space conversions not supported')
287    else:
288        return mul(x, BL_TO_CM_SPACE_MAT4)
289def convert_bl_to_cm_local_space(x):
290    if type(x) == mathutils.Quaternion:
291        raise TypeError('Quaternion space conversions not supported')
292    else:
293        return mul(x, CM_TO_BL_SPACE_MAT4)
294
295
296CM_TO_BL_BONE_ROTATION_MAT4 = mul(
297    bpy_extras.io_utils.axis_conversion(from_forward='Z', from_up='-X', to_forward='Y', to_up='Z').to_4x4(),
298    mathutils.Matrix.Scale(-1, 4, (1, 0, 0))
299)
300BL_TO_CM_BONE_ROTATION_MAT4 = CM_TO_BL_BONE_ROTATION_MAT4.inverted()
301CM_TO_BL_BONE_ROTATION_QUAT = CM_TO_BL_BONE_ROTATION_MAT4.to_quaternion()
302BL_TO_CM_BONE_ROTATION_QUAT = BL_TO_CM_BONE_ROTATION_MAT4.to_quaternion()
303def convert_cm_to_bl_bone_rotation(x):
304    if type(x) == mathutils.Quaternion:
305        raise TypeError('Quaternion space conversions not supported')
306    else:
307        return mul(x, CM_TO_BL_BONE_ROTATION_MAT4)
308def convert_bl_to_cm_bone_rotation(x):
309    if type(x) == mathutils.Quaternion:
310        raise TypeError('Quaternion space conversions not supported')
311    else:
312        return mul(x, BL_TO_CM_BONE_ROTATION_MAT4)
313
314
315#CM_TO_BL_BONE_SPACE_MAT4 = mul(
316#    bpy_extras.io_utils.axis_conversion(from_forward='-X', from_up='Y', to_forward='Y', to_up='Z').to_4x4(),
317#    mathutils.Matrix.Scale(-1, 4, (0, 0, 1))
318#)
319CM_TO_BL_BONE_SPACE_MAT4 = CM_TO_BL_BONE_ROTATION_MAT4.inverted()
320BL_TO_CM_BONE_SPACE_MAT4 = CM_TO_BL_BONE_SPACE_MAT4.inverted()
321CM_TO_BL_BONE_SPACE_QUAT = CM_TO_BL_BONE_SPACE_MAT4.to_quaternion()
322BL_TO_CM_BONE_SPACE_QUAT = BL_TO_CM_BONE_SPACE_MAT4.to_quaternion()
323def convert_cm_to_bl_bone_space(x):
324    if type(x) == mathutils.Quaternion:
325        raise TypeError('Quaternion space conversions not supported')
326    else:
327        return mul(CM_TO_BL_BONE_SPACE_MAT4, x)
328def convert_bl_to_cm_bone_space(x):
329    if type(x) == mathutils.Quaternion:
330        raise TypeError('Quaternion space conversions not supported')
331    else:
332        return mul(BL_TO_CM_BONE_SPACE_MAT4, x)
333
334
335CM_TO_BL_WIDE_SLIDER_SPACE_MAT4 = mul(
336    bpy_extras.io_utils.axis_conversion(from_forward='X', from_up='Y', to_forward='Y', to_up='Z').to_4x4(),
337    mathutils.Matrix.Scale(-1, 4, (0, 1, 0))
338)
339BL_TO_CM_WIDE_SLIDER_SPACE_MAT4 = CM_TO_BL_WIDE_SLIDER_SPACE_MAT4.inverted()
340CM_TO_BL_WIDE_SLIDER_SPACE_QUAT = CM_TO_BL_WIDE_SLIDER_SPACE_MAT4.to_quaternion()
341BL_TO_CM_WIDE_SLIDER_SPACE_QUAT = BL_TO_CM_WIDE_SLIDER_SPACE_MAT4.to_quaternion()
342def convert_cm_to_bl_wide_slider_space(x):
343    if type(x) == mathutils.Quaternion:
344        raise TypeError('Quaternion space conversions not supported')
345    else:
346        return mul(CM_TO_BL_WIDE_SLIDER_SPACE_MAT4, x)
347def convert_bl_to_cm_wide_slider_space(x):
348    if type(x) == mathutils.Quaternion:
349        raise TypeError('Quaternion space conversions not supported')
350    else:
351        return mul(BL_TO_CM_WIDE_SLIDER_SPACE_MAT4, x)
352
353
354CM_TO_BL_SLIDER_SPACE_MAT4 = bpy_extras.io_utils.axis_conversion(from_forward='X', from_up='Y', to_forward='Y', to_up='Z').to_4x4()
355BL_TO_CM_SLIDER_SPACE_MAT4 = CM_TO_BL_SLIDER_SPACE_MAT4.inverted()
356CM_TO_BL_SLIDER_SPACE_QUAT = CM_TO_BL_SLIDER_SPACE_MAT4.to_quaternion()
357BL_TO_CM_SLIDER_SPACE_QUAT = BL_TO_CM_SLIDER_SPACE_MAT4.to_quaternion()
358def convert_cm_to_bl_slider_space(x):
359    if type(x) == mathutils.Quaternion:
360        raise TypeError('Quaternion space conversions not supported')
361    else:
362        return mul(CM_TO_BL_SLIDER_SPACE_MAT4, x)
363def convert_bl_to_cm_slider_space(x):
364    if type(x) == mathutils.Quaternion:
365        raise TypeError('Quaternion space conversions not supported')
366    else:
367        return mul(BL_TO_CM_SLIDER_SPACE_MAT4, x)
368
369
370
371def set_bone_matrix(bone, mat):
372    bone.matrix = mat.copy()
373    #axis, angle = mat.to_quaternion().to_axis_angle()
374    #bone.roll = angle
375    if not IS_LEGACY and isinstance(bone, bpy.types.EditBone):
376        #print("Bone align_roll: ", (mat[0][0],mat[1][0],mat[2][0]))
377        bone.align_roll((mat[0][2],mat[1][2],mat[2][2]))
378    #print("bone: ", bone.matrix)
379    #print("mat:  ", mat)
380
381
382BL28_TO_LEGACY_ICON = {
383    # Renamed in 2.80               
384    'ADD'                          : 'ZOOMIN'             ,  
385    'REMOVE'                       : 'ZOOMOUT'            ,  
386    'FILE_NEW'                     : 'NEW'                ,  
387    'SHADING_BBOX'                 : 'BBOX'               ,  
388    'SHADING_TEXTURE'              : 'POTATO'             , #'TEXTURE_SHADED',  
389    'SHADING_RENDERED'             : 'SMOOTH'             ,  
390    'SHADING_SOLID'                : 'SOLID'              ,  
391    'SHADING_WIRE'                 : 'WIRE'               ,  
392    'XRAY'                         : 'ORTHO'              ,  
393    'PROPERTIES'                   : 'BUTS'               ,  
394    'IMAGE'                        : 'IMAGE_COL'          ,  
395    'OUTLINER'                     : 'OOPS'               ,  
396    'GRAPH'                        : 'IPO'                ,  
397    'PREFERENCES'                  : 'SCRIPTWIN'          ,  
398    'PIVOT_CURSOR'                 : 'CURSOR'             ,  
399    'PIVOT_INDIVIDUAL'             : 'ROTATECOLLECTION'   ,  
400    'PIVOT_MEDIAN'                 : 'ROTATECENTER'       ,  
401    'PIVOT_ACTIVE'                 : 'ROTACTIVE'          ,  
402    'WINDOW'                       : 'FULLSCREEN'         ,  
403    'LIGHT'                        : 'LAMP'               ,  
404    'LIGHT_DATA'                   : 'LAMP_DATA'          ,  
405    'OUTLINER_OB_LIGHT'            : 'OUTLINER_OB_LAMP'   ,  
406    'OUTLINER_DATA_LIGHT'          : 'OUTLINER_DATA_LAMP' ,  
407    'LIGHT_POINT'                  : 'LAMP_POINT'         ,  
408    'LIGHT_SUN'                    : 'LAMP_SUN'           ,  
409    'LIGHT_SPOT'                   : 'LAMP_SPOT'          ,  
410    'LIGHT_HEMI'                   : 'LAMP_HEMI'          ,  
411    'LIGHT_AREA'                   : 'LAMP_AREA'          ,  
412    'HIDE_OFF'                     : 'VISIBLE_IPO_ON'     ,  
413    'HIDE_ON'                      : 'VISIBLE_IPO_OFF'    ,  
414
415    # Added in 2.80
416    'ALEMBIC'                      : None                 ,
417    'ALIGN_BOTTOM'                 : None                 ,  
418    'ALIGN_CENTER'                 : None                 ,  
419    'ALIGN_FLUSH'                  : None                 ,  
420    'ALIGN_JUSTIFY'                : None                 ,  
421    'ALIGN_LEFT'                   : None                 ,  
422    'ALIGN_MIDDLE'                 : None                 ,  
423    'ALIGN_RIGHT'                  : None                 ,  
424    'ALIGN_TOP'                    : None                 ,  
425    'ASSET_MANAGER'                : None                 ,  
426    'BOLD'                         : None                 ,  
427    'DECORATE'                     : None                 ,  
428    'DECORATE_ANIMATE'             : None                 ,  
429    'DECORATE_DRIVER'              : None                 ,  
430    'DECORATE_KEYFRAME'            : None                 ,  
431    'DECORATE_LIBRARY_OVERRIDE'    : None                 ,  
432    'DECORATE_LINKED'              : None                 ,  
433    'DECORATE_LOCKED'              : None                 ,  
434    'DECORATE_OVERRIDE'            : None                 ,  
435    'DECORATE_UNLOCKED'            : None                 ,  
436    'DRIVER_DISTANCE'              : None                 ,  
437    'DRIVER_ROTATIONAL_DIFFERENCE' : None                 ,  
438    'DRIVER_TRANSFORM'             : None                 ,  
439    'DUPLICATE'                    : None                 ,  
440    'FACE_MAPS'                    : None                 ,
441    'FAKE_USER_OFF'                : None                 ,
442    'FAKE_USER_ON'                 : None                 ,
443    'GP_MULTIFRAME_EDITING'        : None                 ,
444    'GP_ONLY_DSELECTED'            : None                 ,
445    'GP_SELECT_POINTS'             : None                 ,
446    'GP_SELECT_STROKES'            : None                 ,
447    'GREASEPENCIL'                 : None                 ,
448    'HEART'                        : None                 ,
449    'ITALIC'                       : None                 ,
450    'LIBRARY_DATA_OVERRIDE'        : None                 ,
451    'LIGHTPROBE_CUBEMAP'           : None                 ,
452    'LIGHTPROBE_GRID'              : None                 ,
453    'LIGHTPROBE_PLANAR'            : None                 ,
454    'LINE_DATA'                    : None                 ,
455    'MATCLOTH'                     : None                 ,
456    'MATFLUID'                     : None                 ,
457    'MATSHADERBALL'                : None                 ,
458    'MOD OPACITY'                  : None                 ,
459    'MOD_HUE_SATURATION'           : None                 ,
460    'MOD_INSTANCE'                 : None                 ,
461    'MOD_NOISE'                    : None                 ,
462    'MOD_OFFSET'                   : None                 ,
463    'MOD_PARTICLE_INSTANCE'        : None                 ,
464    'MOD_SIMPLIFY'                 : None                 ,
465    'MOD_THICKNESS'                : None                 ,
466    'MOD_TIME'                     : None                 ,
467    'MODIFIER_OFF'                 : None                 ,
468    'MODIFIER_ON'                  : None                 ,
469    'MOUSE_LMB'                    : None                 ,
470    'MOUSE_LMB_DRAG'               : None                 ,
471    'MOUSE_MMB'                    : None                 ,
472    'MOUSE_MMB_DRAG'               : None                 ,
473    'MOUSE_MOVE'                   : None                 ,
474    'MOUSE_RMB'                    : None                 ,
475    'MOUSE_RMB_DRAG'               : None                 ,
476    'NORMALS_FACE'                 : None                 ,
477    'NORMALS_VERTEX'               : 'MATCAP_23'          ,
478    'NORMALS_VERTEX_FACE'          : 'MATCAP_23'          ,
479    'OBJECT_ORIGIN'                : None                 ,
480    'ONIONSKIN_OFF'                : None                 ,
481    'ONIONSKIN_ON'                 : None                 ,
482    'ORIENTATION_GIMBAL'           : None                 ,
483    'ORIENTATION_GLOBAL'           : None                 ,
484    'ORIENTATION_LOCAL'            : None                 ,
485    'ORIENTATION_NORMAL'           : None                 ,
486    'ORIENTATION_VIEW'             : None                 ,
487    'OUTLINER_DATA_GREASEPENCIL'   : None                 ,
488    'OUTLINER_OB_IMAGE'            : None                 ,
489    'OUTLINER_OB_LIGHTPROBE'       : None                 ,
490    'OVERLAY'                      : None                 ,
491    'PRESET'                       : None                 ,
492    'PRESET_NEW'                   : None                 ,
493    'SEALED'                       : None                 ,
494    'SETTINGS'                     : None                 ,
495    'SHADERFX'                     : None                 ,
496    'SMALL_CAPS'                   : None                 ,
497    'SYSTEM'                       : None                 ,
498    'THREE_DOTS'                   : None                 ,
499    'TOOL_SETTINGS'                : None                 ,
500    'TRACKING'                     : None                 ,
501
502    # Other
503    #'ARROW_LEFTRIGHT'              : 'MAN_SCALE'         ,
504    #'FILE_FOLDER'                  : 'FILESEL'           ,
505    #'FILEBROWSER'                  : 'FILESEL'           ,
506    #'FILE_IMAGE'                   : 'IMAGE_COL'         ,
507    #'MOD_DATA_TRANSFER'            : 'RETOPO'            ,
508    #'BRUSH_SOFTEN'                 : 'MATCAP_19'         ,
509    #'CLIPUV_DEHLT'                 : 'MATCAP_24'         ,
510    #'MESH_CIRCLE'                  : 'MATCAP_24'         ,
511    #'VIS_SEL_01'                   : 'VISIBLE_IPO_OFF'   ,
512    #'VIS_SEL_11'                   : 'VISIBLE_IPO_ON'    ,
513    #'BRUSH_TEXFILL'                : 'MATCAP_05'         ,
514    #'NODE_MATERIAL'                : 'MATCAP_05'         ,
515    #'HOLDOUT_ON'                   : 'MATCAP_13'         ,
516}
517
518LEGACY_TO_BL28_ICON = {
519    # Renamed in 2.80
520    'ZOOMIN'                       : 'ADD'                ,  
521    'ZOOMOUT'                      : 'REMOVE'             ,  
522    'NEW'                          : 'FILE_NEW'           ,  
523    'BBOX'                         : 'SHADING_BBOX'       ,  
524    'POTATO'                       : 'SHADING_TEXTURE'    , #'TEXTURE_SHADED',  
525    'SMOOTH'                       : 'SHADING_RENDERED'   ,  
526    'SOLID'                        : 'SHADING_SOLID'      ,  
527    'WIRE'                         : 'SHADING_WIRE'       ,  
528    'ORTHO'                        : 'XRAY'               ,  
529    'BUTS'                         : 'PROPERTIES'         ,  
530    'IMAGE_COL'                    : 'IMAGE'              ,  
531    'OOPS'                         : 'OUTLINER'           ,  
532    'IPO'                          : 'GRAPH'              ,  
533    'SCRIPTWIN'                    : 'PREFERENCES'        ,  
534    'CURSOR'                       : 'PIVOT_CURSOR'       ,  
535    'ROTATECOLLECTION'             : 'PIVOT_INDIVIDUAL'   ,  
536    'ROTATECENTER'                 : 'PIVOT_MEDIAN'       ,  
537    'ROTACTIVE'                    : 'PIVOT_ACTIVE'       ,  
538    'FULLSCREEN'                   : 'WINDOW'             ,  
539    'LAMP'                         : 'LIGHT'              ,  
540    'LAMP_DATA'                    : 'LIGHT_DATA'         ,  
541    'OUTLINER_OB_LAMP'             : 'OUTLINER_OB_LIGHT'  ,  
542    'OUTLINER_DATA_LAMP'           : 'OUTLINER_DATA_LIGHT',  
543    'LAMP_POINT'                   : 'LIGHT_POINT'        ,  
544    'LAMP_SUN'                     : 'LIGHT_SUN'          ,  
545    'LAMP_SPOT'                    : 'LIGHT_SPOT'         ,  
546    'LAMP_HEMI'                    : 'LIGHT_HEMI'         ,  
547    'LAMP_AREA'                    : 'LIGHT_AREA'         ,  
548    'VISIBLE_IPO_ON'               : 'HIDE_OFF'           ,  
549    'VISIBLE_IPO_OFF'              : 'HIDE_ON'            ,  
550                                                          
551    # Removed in 2.80              
552    'LINK_AREA'                    : 'LINKED'             ,
553    'PLUG'                         : 'PLUGIN'             ,
554    'EDIT'                         : None                 , 
555    'GAME'                         : None                 , 
556    'RADIO'                        : None                 ,
557    'DOTSUP'                       : 'DOT'                ,
558    'DOTSDOWN'                     : 'DOT'                ,
559    'LINK'                         : 'LAYER_USED'         , #(maybe use DOT, LAYER_ACTIVE or LAYER_USED)
560    'INLINK'                       : None                 ,  
561    'GO_LEFT'                      : None                 ,
562    'TEMPERATURE'                  : None                 ,
563    'SNAP_SURFACE'                 : None                 ,
564    'MANIPUL'                      : None                 ,
565    'BORDER_LASSO'                 : None                 ,
566    'MAN_TRANS'                    : None                 ,
567    'MAN_ROT'                      : None                 ,
568    'MAN_SCALE'                    : None                 ,
569    'RENDER_REGION'                : None                 ,
570    'RECOVER_AUTO'                 : None                 ,
571    'SAVE_COPY'                    : None                 ,
572    'OPEN_RECENT'                  : None                 ,
573    'LOAD_FACTORY'                 : None                 ,
574    'ALIGN'                        : None                 ,
575    'SPACE2'                       : None                 ,
576    'ROTATE'                       : None                 ,
577    'SAVE_AS'                      : None                 ,
578    'BORDER_RECT'                  : None                 ,
579}                                                          
580
581def icon(key):
582    if IS_LEGACY:
583        # 対応アイコンがdictにない場合はNONEとする
584        return BL28_TO_LEGACY_ICON.get(key, key) or 'NONE'
585    else:
586        return LEGACY_TO_BL28_ICON.get(key, key) or 'NONE'
587        
588    return key
589
590
591def region_type():
592    if IS_LEGACY:
593        return 'TOOLS'
594
595    return 'UI'
596
597
598def pref_type():
599    if IS_LEGACY:
600        return 'USER_PREFERENCES'
601
602    return 'PREFERENCES'
603
604
605def get_prefs(context):
606    if IS_LEGACY:
607        return context.user_preferences
608
609    return context.preferences
610
611
612def get_system(context):
613    if IS_LEGACY:
614        return get_prefs(context).system
615
616    return get_prefs(context).view
617
618
619def get_tex_image(context, node_name=None):
620    if IS_LEGACY:
621        if hasattr(context, 'texture'):
622            tex = context.texture
623            if tex:
624                return tex.image
625    else:
626        mate = context.material
627        if mate and mate.use_nodes:
628            node = mate.node_tree.nodes.get(node_name)
629            if node and node.type == 'TEX_IMAGE':
630                return node.image
631
632    return None
633
634
635
636# Property Subtypes
637# Blender 2.91 = [‘NONE’, ‘FILEPATH’ , ‘DIRPATH’ , ‘FILENAME’, ‘BYTESTRING’, ‘PASSWORD’, ‘PIXEL’, ‘UNSIGNED’, ‘PERCENTAGE’, ‘FACTOR’, ‘ANGLE’, ‘TIME’, ‘DISTANCE’, ‘DISTANCE_CAMERA’, ‘POWER’, ‘TEMPERATURE’, ‘COLOR’, ‘TRANSLATION’, ‘DIRECTION’, ‘VELOCITY’, ‘ACCELERATION’, ‘MATRIX’, ‘EULER’, ‘QUATERNION’, ‘AXISANGLE’, ‘XYZ’, ‘XYZ_LENGTH’, ‘COLOR_GAMMA’, ‘COORDS’     , ‘LAYER’, ‘LAYER_MEMBER’    ]
638# Blender 2.80 = [‘NONE’, ‘FILE_PATH’, ‘DIR_PATH’,                                       ‘PIXEL’, ‘UNSIGNED’, ‘PERCENTAGE’, ‘FACTOR’, ‘ANGLE’, ‘TIME’, ‘DISTANCE’,                                            ‘COLOR’, ‘TRANSLATION’, ‘DIRECTION’,                             ‘MATRIX’, ‘EULER’, ‘QUATERNION’,              ‘XYZ’,               ‘COLOR_GAMMA’, ‘COORDINATES’, ‘LAYER’, ‘LAYER_MEMBERSHIP’]
639# Blender 2.78 = [‘NONE’, ‘FILE_PATH’, ‘DIR_PATH’,                                       ‘PIXEL’, ‘UNSIGNED’, ‘PERCENTAGE’, ‘FACTOR’, ‘ANGLE’, ‘TIME’, ‘DISTANCE’,                                            ‘COLOR’, ‘TRANSLATION’, ‘DIRECTION’,                             ‘MATRIX’, ‘EULER’, ‘QUATERNION’,              ‘XYZ’,               ‘COLOR_GAMMA’, ‘COORDINATES’, ‘LAYER’, ‘LAYER_MEMBERSHIP’]
640
641BL29_TO_BL28_SUBTYPE = {
642    #'NONE'           : 'NONE'            ,
643    'FILEPATH'        : 'FILE_PATH'       ,
644    'DIRPATH'         : 'DIR_PATH'        ,
645    'FILENAME'        : None              ,
646    'BYTESTRING'      : None              ,
647    'PASSWORD'        : None              ,
648    #'PIXEL'          : 'PIXEL'           ,
649    #'UNSIGNED'       : 'UNSIGNED'        ,
650    #'PERCENTAGE'     : 'PERCENTAGE'      ,
651    #'FACTOR'         : 'FACTOR'          ,
652    #'ANGLE'          : 'ANGLE'           ,
653    #'TIME'           : 'TIME'            ,
654    #'DISTANCE'       : 'DISTANCE'        , 
655    'DISTANCE_CAMERA' : 'DISTANCE'        , 
656    'POWER'           : None              , 
657    'TEMPERATURE'     : None              , 
658    #'COLOR'          : 'COLOR'           , 
659    #'TRANSLATION'    : 'TRANSLATION'     , 
660    #'DIRECTION'      : 'DIRECTION'       , 
661    'VELOCITY'        : 'XYZ'             , 
662    'ACCELERATION'    : 'XYZ'             , 
663    #'MATRIX'         : 'MATRIX'          , 
664    #'EULER'          : 'EULER'           , 
665    #'QUATERNION'     : 'QUATERNION'      , 
666    'AXISANGLE'       : 'XYZ'             , 
667    #'XYZ'            : 'XYZ'             , 
668    'XYZ_LENGTH'      : 'XYZ'             , 
669    #'COLOR_GAMMA'    : 'COLOR_GAMMA'     , 
670    'COORDS'          : 'COORDINATES'     , 
671    #'LAYER'          : 'LAYER'           , 
672    'LAYER_MEMBER'    : 'LAYER_MEMBERSHIP', 
673}
674
675def subtype(key):
676    if bpy.app.version < (2, 91):
677        return BL29_TO_BL28_SUBTYPE.get(key, key) or 'NONE'
678    return key
679
680
681# Property Units
682# Blender 2.91 = [‘NONE’, ‘LENGTH’, ‘AREA’, ‘VOLUME’, ‘ROTATION’, ‘TIME’, ‘VELOCITY’, ‘ACCELERATION’, ‘MASS’, ‘CAMERA’, ‘POWER’, ‘TEMPERATURE’]
683# Blender 2.80 = [‘NONE’, ‘LENGTH’, ‘AREA’, ‘VOLUME’, ‘ROTATION’, ‘TIME’, ‘VELOCITY’, ‘ACCELERATION’, ‘MASS’, ‘CAMERA’, ‘POWER’]
684# Blender 2.78 = [‘NONE’, ‘LENGTH’, ‘AREA’, ‘VOLUME’, ‘ROTATION’, ‘TIME’, ‘VELOCITY’, ‘ACCELERATION’,         ‘CAMERA’]
685
686BL29_TO_LEGACY_UNIT = {
687    'MASS'        : None,
688    'POWER'       : None,
689    'TEMPERATURE' : None,
690}
691
692BL29_TO_BL28_UNIT = {
693    'TEMPERATURE' : None,
694}
695
696def unit(key):
697    if IS_LEGACY:
698        return BL29_TO_LEGACY_UNIT.get(key, key) or 'NONE'
699    elif bpy.app.version < (2, 91):
700        return BL29_TO_BL28_UNIT.get(key, key) or 'NONE'
701    return key
IS_LEGACY = False
class BlRegister:
17class BlRegister():
18    idnames = set()
19    classes = []
20
21    def __init__(self, *args, **kwargs):
22        self.make_annotation = kwargs.get('make_annotation', True)
23        self.use_bl_attr = kwargs.get('use_bl_attr', True)
24        self.only_legacy = kwargs.get('only_legacy', False)
25        self.only_latest = kwargs.get('only_latest', False)
26
27    def __call__(self, cls):
28
29        if hasattr(cls, 'bl_idname'):
30            bl_idname = cls.bl_idname
31        else:
32            if self.use_bl_attr:
33                bl_ctx = getattr(cls, 'bl_context', '')
34                bl_idname = f'{cls.bl_space_type}{cls.bl_region_type}{bl_ctx}{cls.bl_label}'
35            else:
36                bl_idname = cls.__qualname__
37
38        if self.only_legacy:
39            if IS_LEGACY:
40                BlRegister.add(bl_idname, cls)
41        elif self.only_latest:
42            if IS_LEGACY is False:
43                BlRegister.add(bl_idname, cls)
44        else:
45            BlRegister.add(bl_idname, cls)
46
47        if self.make_annotation:
48            cls = make_annotations(cls)
49
50        if not IS_LEGACY and bpy.app.version >= (2, 93):
51            cls = make_prop_annotations(cls)
52
53        return cls
54
55    @classmethod
56    def add(cls: type, bl_idname: str, op_class: type) -> None:
57        if bl_idname in cls.idnames:
58            raise RuntimeError("Duplicate bl_idname: %s" % bl_idname)
59
60        cls.idnames.add(bl_idname)
61        cls.classes.append(op_class)
62
63    @classmethod
64    def register(cls):
65        for cls1 in cls.classes:
66            bpy.utils.register_class(cls1)
67
68    @classmethod
69    def unregister(cls):
70        for cls1 in reversed(cls.classes):
71            bpy.utils.unregister_class(cls1)
72
73    @classmethod
74    def cleanup(cls):
75        cls.classes.clear()
76        cls.idnames.clear()
BlRegister(*args, **kwargs)
21    def __init__(self, *args, **kwargs):
22        self.make_annotation = kwargs.get('make_annotation', True)
23        self.use_bl_attr = kwargs.get('use_bl_attr', True)
24        self.only_legacy = kwargs.get('only_legacy', False)
25        self.only_latest = kwargs.get('only_latest', False)
idnames = {'object.quick_hemi_bake_image', 'object.quick_bulge_bake_image', 'object.quick_density_bake_image', 'object.quick_dirty_bake_image', 'image.quick_export_cm3d2_tex', 'TEXTURE_MT_context_texture_values_OutlineWidth', 'CM3D2Menu', 'cm3d2menu.command_add', 'texture.reset_offset', 'cm3d2menu.export', 'text.paste_text_bone_data', 'text.show_text', 'anim.convert_to_cm3d2_interpolation', 'wm.show_cm3d2_converter_preference', 'armature.encode_cm3d2_bone_names', 'mesh.split_sharp', 'material.paste_material', 'object.quick_metal_bake_image', 'object.paste_armature_bone_data_property', 'object.change_base_shape_key', 'material.copy_material', 'object.precision_transfer_vertex_group', 'TEXTURE_MT_context_texture_values_RimPower', 'object.quick_blur_vertex_group', 'cm3d2menu.command_move', 'texture.reload_textures', 'geometry.attribute_from_custom_normals', 'object.quick_uv_border_bake_image', 'CNV_PG_cm3d2_bone_morph', 'wm.append_cm3d2_figure', 'object.quick_mesh_distance_bake_image', 'mesh.selected_face_sort_front', 'CM3D2MenuParam', 'import_anim.import_cm3d2_anm', 'cm3d2menu.align_selected_to_attach_point', 'DATA_PT_cm3d2_body_sliders', 'cm3d2_converter.dump_py_messages', 'object.quick_semen_bake_image', 'object.quick_gradation_bake_image', 'object.add_cm3d2_body_sliders', 'object.quick_ao_bake_image', 'import_mesh.import_cm3d2_model', 'object.cleanup_scale_bones', 'object.precision_shape_key_transfer', 'curve.hair_bunch_add', 'pose.apply_prime_field', 'object.save_cm3d2_body_sliders_to_menu', 'text.import_cm3d2_mate_text', 'mesh.remove_and_mark_doubles', 'object.remove_armature_bone_data_property', 'CM3D2MENU_UL_command_list', 'cm3d2menu.align_attach_point_to_selected', 'texture.setup_image_name', 'texture.reset_scale', 'object.forced_modifier_apply', 'object.quick_side_shadow_bake_image', 'CM3D2MenuMiscCommand', 'CM3D2PropertyMenuCommand', 'object.quick_transfer_vertex_group', 'object.blur_vertex_group', 'image.show_image', 'text.copy_text_bone_data', 'object.paste_object_bone_data_property', 'texture.set_default_toon_textures', 'PROPERTIESWINDOWCNV_SelectorItem', 'script.update_cm3d2_converter', 'object.encode_cm3d2_vertex_group_names', 'texture.sync_tex_color_ramps', 'material.import_cm3d2_mate', 'material.mateprop_expand', 'object.add_cm3d2_twist_bones', 'texture.set_color_value', 'cm3d2menu.command_remove', 'object.copy_object_bone_data_property', 'DATA_PT_cm3d2_sliders', 'MATERIAL_PT_cm3d2_properties', 'TEXTURE_MT_context_texture_values_normal', 'MISC_INFO_MT_add_cm3d2', 'object.quick_mesh_border_bake_image', 'TEXTURE_MT_texture_OutlineToonRamp', 'CNV_PG_cm3d2_wide_slider', 'cm3d2menu.import', 'CM3D2MenuAttachPointCommand', 'DATA_PT_cm3d2_wide_sliders', 'render.render_cm3d2_icon', 'CM3D2MenuCommandPointer', 'material.new_cm3d2', 'OBJECT_PT_cm3d2_menu', 'image.replace_cm3d2_tex', 'material.new_com3d2', 'object.add_bake_image', 'fcurve.convert_to_cm3d2_interpolation', 'object.align_to_cm3d2_base_bone', 'object.remove_noassign_vertex_groups', 'PROPERTIESWINDOWVertex Groups Selector', 'armature.decode_cm3d2_bone_names', 'export_anim.export_cm3d2_anm', 'CM3D2 Converter', 'object.blur_shape_key', 'PROPERTIESWINDOWCNV_UL_modifier_selector', 'object.multiply_vertex_group', 'TEXTURE_MT_context_texture_values_ZTest', 'material.decorate_material', 'object.decode_cm3d2_vertex_group_names', 'object.remove_object_bone_data_property', 'texture.auto_set_color_value', 'TEXTURE_MT_texture_ShadowRateToon', 'material.setup_mate_expand', 'mesh.selected_mesh_vertex_group_calculation', 'object.weighted_shape_key_transfer', 'texture.set_value', 'INFO_MT_help_CM3D2_Converter_RSS', 'pose.copy_prime_field', 'mesh.selected_mesh_vertex_group_blur', 'text.export_cm3d2_mate_text', 'cm3d2menu.param_add', 'image.export_cm3d2_tex', 'image.import_cm3d2_tex', 'texture.set_cm3d2path', 'object.quick_shadow_bake_image', 'object.quick_shape_key_transfer', 'text.remove_all_material_texts', 'cm3d2menu.param_remove', 'object.copy_armature_bone_data_property', 'object.sync_object_transform', 'object.quick_hair_bake_image', 'geometry.attribute_convert_normals', 'mesh.vertices_count_checker', 'object.copy_shape_key_values', 'material.export_cm3d2_mate', 'material.quick_texture_show', 'TEXTURE_MT_texture_ToonRamp', 'object.multiply_shape_key', 'export_mesh.export_cm3d2_model', 'cm3d2menu.param_move'}
classes = [<class 'CM3D2 Converter.translations.CNV_OT_dump_py_messages'>, <class 'CM3D2 Converter.common.CNV_SelectorItem'>, <class 'CM3D2 Converter.model_export.CNV_OT_export_cm3d2_model'>, <class 'CM3D2 Converter.misc_OBJECT_PT_transform.CNV_OT_sync_object_transform'>, <class 'CM3D2 Converter.misc_OBJECT_PT_transform.CNV_OT_align_to_cm3d2_base_bone'>, <class 'CM3D2 Converter.model_import.CNV_OT_import_cm3d2_model'>, <class 'CM3D2 Converter.anm_import.CNV_OT_import_cm3d2_anm'>, <class 'CM3D2 Converter.misc_DOPESHEET_MT_editor_menus.CNV_OT_FCURVE_convert_to_cm3d2_interpolation'>, <class 'CM3D2 Converter.misc_DOPESHEET_MT_editor_menus.CNV_OT_ANIM_convert_to_cm3d2_interpolation'>, <class 'CM3D2 Converter.anm_export.CNV_OT_export_cm3d2_anm'>, <class 'CM3D2 Converter.tex_import.CNV_OT_import_cm3d2_tex'>, <class 'CM3D2 Converter.tex_export.CNV_OT_export_cm3d2_tex'>, <class 'CM3D2 Converter.mate_import.CNV_OT_import_cm3d2_mate'>, <class 'CM3D2 Converter.mate_import.CNV_OT_import_cm3d2_mate_text'>, <class 'CM3D2 Converter.mate_export.CNV_OT_export_cm3d2_mate'>, <class 'CM3D2 Converter.mate_export.CNV_OT_export_cm3d2_mate_text'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_CommandPointer'>, <class 'CM3D2 Converter.menu_file.MISCCOMMAND_PG_Param'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_AttachPointCommand'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_PropertyCommand'>, <class 'CM3D2 Converter.menu_file.CM3D2MENU_PG_MiscCommand'>, <class 'CM3D2 Converter.menu_file.OBJECT_PG_CM3D2Menu'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_UL_command_list'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.OBJECT_PT_cm3d2_menu'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_import'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_export'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_command_add'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_command_remove'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_command_move'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_align_selected_to_attach_point'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_align_attach_point_to_selected'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_param_add'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_param_remove'>, <class 'CM3D2 Converter.menu_OBJECT_PT_cm3d2_menu.CM3D2MENU_OT_param_move'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_decode_cm3d2_bone_names'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_encode_cm3d2_bone_names'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_copy_armature_bone_data_property'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_paste_armature_bone_data_property'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_remove_armature_bone_data_property'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_add_cm3d2_twist_bones'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_PG_cm3d2_bone_morph'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_PG_cm3d2_wide_slider'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_add_cm3d2_body_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.DATA_PT_cm3d2_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.DATA_PT_cm3d2_body_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.DATA_PT_cm3d2_wide_sliders'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_cleanup_scale_bones'>, <class 'CM3D2 Converter.misc_DATA_PT_context_arm.CNV_OT_save_cm3d2_body_sliders_to_menu'>, <class 'CM3D2 Converter.misc_DATA_PT_modifiers.CNV_UL_modifier_selector'>, <class 'CM3D2 Converter.misc_DATA_PT_modifiers.CNV_OT_forced_modifier_apply'>, <class 'CM3D2 Converter.misc_DATA_PT_vertex_groups.CNV_OT_decode_cm3d2_vertex_group_names'>, <class 'CM3D2 Converter.misc_DATA_PT_vertex_groups.CNV_OT_encode_cm3d2_vertex_group_names'>, <class 'CM3D2 Converter.misc_INFO_HT_header.CNV_OT_vertices_count_checker'>, <class 'CM3D2 Converter.misc_INFO_MT_add.misc_INFO_MT_add_cm3d2'>, <class 'CM3D2 Converter.misc_INFO_MT_add.CNV_OT_append_cm3d2_figure'>, <class 'CM3D2 Converter.misc_INFO_MT_curve_add.CNV_OT_hair_bunch_add'>, <class 'CM3D2 Converter.misc_INFO_MT_help.INFO_MT_help_CM3D2_Converter_RSS'>, <class 'CM3D2 Converter.misc_INFO_MT_help.CNV_OT_update_cm3d2_converter'>, <class 'CM3D2 Converter.misc_INFO_MT_help.CNV_OT_show_cm3d2_converter_preference'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.MATERIAL_PT_cm3d2_properties'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_new_cm3d2'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_new_com3d2'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_paste_material'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_copy_material'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_decorate_material'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_quick_texture_show'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_setup_material_expand'>, <class 'CM3D2 Converter.misc_MATERIAL_PT_context_material.CNV_OT_material_prop_expand'>, <class 'CM3D2 Converter.misc_MESH_MT_attribute_context_menu.CNV_OT_attribute_from_custom_normals'>, <class 'CM3D2 Converter.misc_MESH_MT_attribute_context_menu.CNV_OT_attribute_convert_normals'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_quick_shape_key_transfer'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_precision_shape_key_transfer'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_UL_vgroups_selector'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_weighted_shape_key_transfer'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_multiply_shape_key'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_blur_shape_key'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_change_base_shape_key'>, <class 'CM3D2 Converter.misc_MESH_MT_shape_key_specials.CNV_OT_copy_shape_key_values'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_quick_transfer_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_precision_transfer_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_quick_blur_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_blur_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_multiply_vertex_group'>, <class 'CM3D2 Converter.misc_MESH_MT_vertex_group_specials.CNV_OT_remove_noassign_vertex_groups'>, <class 'CM3D2 Converter.misc_OBJECT_PT_context_object.CNV_OT_copy_object_bone_data_property'>, <class 'CM3D2 Converter.misc_OBJECT_PT_context_object.CNV_OT_paste_object_bone_data_property'>, <class 'CM3D2 Converter.misc_OBJECT_PT_context_object.CNV_OT_remove_object_bone_data_property'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_add_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_ao_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_dirty_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_hemi_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_shadow_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_side_shadow_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_gradation_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_metal_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_hair_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_uv_border_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_mesh_border_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_density_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_mesh_distance_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_bulge_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_bake.CNV_OT_quick_semen_bake_image'>, <class 'CM3D2 Converter.misc_RENDER_PT_render.CNV_OT_render_cm3d2_icon'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_normal'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_OutlineWidth'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_RimPower'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_context_texture_values_ZTest'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_show_image'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_replace_cm3d2_tex'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_sync_tex_color_ramps'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_default_toon_textures'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_reload_textures'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_auto_set_color_value'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_quick_export_cm3d2_tex'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_color_value'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_value'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_texture_reset_offset'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_texture_reset_scale'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_set_cm3d2path'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.CNV_OT_setup_image_name'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_texture_ToonRamp'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_texture_ShadowRateToon'>, <class 'CM3D2 Converter.misc_TEXTURE_PT_context_texture.TEXTURE_MT_texture_OutlineToonRamp'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_show_text'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_copy_text_bone_data'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_paste_text_bone_data'>, <class 'CM3D2 Converter.misc_TEXT_HT_header.CNV_OT_remove_all_material_texts'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_edit_mesh_merge.CNV_OT_remove_and_mark_doubles'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_edit_mesh_specials.CNV_OT_selected_mesh_sort_front'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_edit_mesh_split.CNV_OT_split_sharp'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_pose_apply.CNV_OT_copy_prime_field'>, <class 'CM3D2 Converter.misc_VIEW3D_MT_pose_apply.CNV_OT_apply_prime_field'>, <class 'CM3D2 Converter.misc_VIEW3D_PT_tools_weightpaint.CNV_OT_selected_mesh_vertex_group_blur'>, <class 'CM3D2 Converter.misc_VIEW3D_PT_tools_weightpaint.CNV_OT_selected_mesh_vertex_group_calculation'>, <class 'CM3D2 Converter.AddonPreferences'>]
make_annotation
use_bl_attr
only_legacy
only_latest
@classmethod
def add(cls: type, bl_idname: str, op_class: type) -> None:
55    @classmethod
56    def add(cls: type, bl_idname: str, op_class: type) -> None:
57        if bl_idname in cls.idnames:
58            raise RuntimeError("Duplicate bl_idname: %s" % bl_idname)
59
60        cls.idnames.add(bl_idname)
61        cls.classes.append(op_class)
@classmethod
def register(cls):
63    @classmethod
64    def register(cls):
65        for cls1 in cls.classes:
66            bpy.utils.register_class(cls1)
@classmethod
def unregister(cls):
68    @classmethod
69    def unregister(cls):
70        for cls1 in reversed(cls.classes):
71            bpy.utils.unregister_class(cls1)
@classmethod
def cleanup(cls):
73    @classmethod
74    def cleanup(cls):
75        cls.classes.clear()
76        cls.idnames.clear()
def make_prop_annotations(cls):
78def make_prop_annotations(cls):
79    if IS_LEGACY:
80        return cls
81
82    prop_type = bpy.props._PropertyDeferred
83    annotations = cls.__annotations__ if hasattr(cls, "__annotations__") else dict()
84
85    for prop_name in dir(cls):
86        prop = getattr(cls, prop_name)
87        if type(prop) != prop_type:
88            continue
89        annotations[prop_name] = prop
90    
91    setattr(cls, "__annotations__", annotations)
92    #print(cls.__annotations__)
93    return cls
def make_annotations(cls):
 96def make_annotations(cls):
 97    if IS_LEGACY:
 98        return cls
 99
100    cls_props = {}
101    for k, v in cls.__dict__.items():
102        if isinstance(v, tuple):
103            cls_props[k] = v
104
105    annos = cls.__dict__.get('__annotations__')  # type: dict[str, type]
106    if annos is None:
107        annos = {}
108        setattr(cls, '__annotations__', annos)
109
110    for k, v in cls_props.items():
111        annos[k] = v
112        delattr(cls, k)
113
114    # 親クラスを辿ってアノテーションを生成
115    for bc in cls.__bases__:
116        # bpyのタイプやbuiltinsの場合はスキップ
117        if bc.__module__ in ['bpy_types', 'builtins']:
118            continue
119        make_annotations(bc)
120
121    return cls
def layout_split(layout, factor=0.0, align=False):
124def layout_split(layout, factor=0.0, align=False):
125    if IS_LEGACY:
126        return layout.split(percentage=factor, align=align)
127
128    return layout.split(factor=factor, align=align)
def get_active(context):
137def get_active(context):
138    if IS_LEGACY:
139        return context.scene.objects.active
140
141    return context.view_layer.objects.active
def set_active(context, obj):
144def set_active(context, obj):
145    if IS_LEGACY:
146        context.scene.objects.active = obj
147    else:
148        context.view_layer.objects.active = obj
def get_active_uv(me):
151def get_active_uv(me):
152    if IS_LEGACY:
153        uvs = me.uv_textures
154    else:
155        uvs = me.uv_layers
156    return uvs.active
def set_display_type(ob, disp_type):
159def set_display_type(ob, disp_type):
160    if IS_LEGACY:
161        ob.draw_type = disp_type
162    else:
163        ob.display_type = disp_type
def get_select(obj: bpy_types.Object) -> bool:
166def get_select(obj: bpy.types.Object) -> bool:
167    if IS_LEGACY:
168        return obj.select
169
170    return obj.select_get()
def set_select(obj: bpy_types.Object, select: bool) -> None:
173def set_select(obj: bpy.types.Object, select: bool) -> None:
174    if IS_LEGACY:
175        obj.select = select
176    else:
177        obj.select_set(select)
def is_select(*args) -> bool:
180def is_select(*args) -> bool:
181    """すべてが選択状態であるかを判定する."""
182    if IS_LEGACY:
183        return all(arg.select for arg in args)
184
185    return all(arg.select_get() for arg in args)

すべてが選択状態であるかを判定する.

def get_hide(obj: bpy_types.Object) -> bool:
188def get_hide(obj: bpy.types.Object) -> bool:
189    if IS_LEGACY:
190        return obj.hide
191
192    return obj.hide_viewport
def set_hide(obj: bpy_types.Object, hide: bool):
195def set_hide(obj: bpy.types.Object, hide: bool):
196    if IS_LEGACY:
197        obj.hide = hide
198
199    else:
200        obj.hide_viewport = hide
def get_cursor_loc(context):
220def get_cursor_loc(context):
221    if IS_LEGACY:
222        return context.space_data.cursor_location
223    else:
224        return context.scene.cursor.location
def get_lights(blend_data):
227def get_lights(blend_data):
228    if IS_LEGACY:
229        return blend_data.iamps
230    else:
231        return blend_data.lights
def mul(x, y):
234def mul(x, y):
235    if IS_LEGACY:
236        return x * y
237
238    return x @ y
def mul3(x, y, z):
241def mul3(x, y, z):
242    if IS_LEGACY:
243        return x * y * z
244
245    return x @ y @ z
def mul4(w, x, y, z):
248def mul4(w, x, y, z):
249    if IS_LEGACY:
250        return w * x * y * z
251
252    return w @ x @ y @ z
def transform_inverse(m: Matrix) -> Matrix:
254def transform_inverse(m: mathutils.Matrix) -> mathutils.Matrix:
255    """Returns the inverse of a 4x4 transformation matrix
256    with the translation handled properly"""
257    inv_m = m.copy()
258    inv_m.translation = mathutils.Vector((0,0,0))
259    inv_m.invert()
260    inv_m.translation = mul(inv_m.to_3x3(), -m.translation)
261    return inv_m

Returns the inverse of a 4x4 transformation matrix with the translation handled properly

CM_TO_BL_SPACE_MAT4 = Matrix(((-1.0, 0.0, 0.0, 0.0), (0.0, 0.0, -1.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_SPACE_MAT4 = Matrix(((-1.0, 0.0, -0.0, 0.0), (0.0, -0.0, 1.0, -0.0), (-0.0, -1.0, -0.0, 0.0), (0.0, -0.0, -0.0, 1.0)))
CM_TO_BL_SPACE_QUAT = Quaternion((0.7071068286895752, -0.7071068286895752, 0.0, 0.0))
BL_TO_CM_SPACE_QUAT = Quaternion((0.7071068286895752, 0.7071068286895752, 0.0, 0.0))
def convert_cm_to_bl_space(x, lossless=True):
271def convert_cm_to_bl_space(x, lossless=True):
272    if type(x) == mathutils.Quaternion:
273        raise TypeError('Quaternion space conversions not supported')
274    elif lossless and type(x) == mathutils.Vector:
275        return mathutils.Vector((-x.x, -x.z, x.y))
276    else:
277        return mul(CM_TO_BL_SPACE_MAT4, x)
def convert_bl_to_cm_space(x, lossless=True):
278def convert_bl_to_cm_space(x, lossless=True):
279    if type(x) == mathutils.Quaternion:
280        raise TypeError('Quaternion space conversions not supported')
281    elif lossless and len(x) == 3:
282        return mathutils.Vector((-x[0], x[2], -x[1]))
283    else:
284        return mul(BL_TO_CM_SPACE_MAT4, x)
def convert_cm_to_bl_local_space(x):
285def convert_cm_to_bl_local_space(x):
286    if type(x) == mathutils.Quaternion:
287        raise TypeError('Quaternion space conversions not supported')
288    else:
289        return mul(x, BL_TO_CM_SPACE_MAT4)
def convert_bl_to_cm_local_space(x):
290def convert_bl_to_cm_local_space(x):
291    if type(x) == mathutils.Quaternion:
292        raise TypeError('Quaternion space conversions not supported')
293    else:
294        return mul(x, CM_TO_BL_SPACE_MAT4)
CM_TO_BL_BONE_ROTATION_MAT4 = Matrix(((0.0, -1.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0), (1.0, 0.0, 0.0, 0.0), (0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_BONE_ROTATION_MAT4 = Matrix(((-0.0, 0.0, 1.0, 0.0), (-1.0, -0.0, 0.0, -0.0), (-0.0, 1.0, -0.0, 0.0), (0.0, -0.0, 0.0, 1.0)))
CM_TO_BL_BONE_ROTATION_QUAT = Quaternion((0.5, 0.5, 0.5, -0.5))
BL_TO_CM_BONE_ROTATION_QUAT = Quaternion((0.5, -0.5, -0.5, 0.5))
def convert_cm_to_bl_bone_rotation(x):
304def convert_cm_to_bl_bone_rotation(x):
305    if type(x) == mathutils.Quaternion:
306        raise TypeError('Quaternion space conversions not supported')
307    else:
308        return mul(x, CM_TO_BL_BONE_ROTATION_MAT4)
def convert_bl_to_cm_bone_rotation(x):
309def convert_bl_to_cm_bone_rotation(x):
310    if type(x) == mathutils.Quaternion:
311        raise TypeError('Quaternion space conversions not supported')
312    else:
313        return mul(x, BL_TO_CM_BONE_ROTATION_MAT4)
CM_TO_BL_BONE_SPACE_MAT4 = Matrix(((-0.0, 0.0, 1.0, 0.0), (-1.0, -0.0, 0.0, -0.0), (-0.0, 1.0, -0.0, 0.0), (0.0, -0.0, 0.0, 1.0)))
BL_TO_CM_BONE_SPACE_MAT4 = Matrix(((-0.0, -1.0, -0.0, 0.0), (0.0, -0.0, 1.0, -0.0), (1.0, 0.0, -0.0, 0.0), (0.0, -0.0, 0.0, 1.0)))
CM_TO_BL_BONE_SPACE_QUAT = Quaternion((0.5, -0.5, -0.5, 0.5))
BL_TO_CM_BONE_SPACE_QUAT = Quaternion((0.5, 0.5, 0.5, -0.5))
def convert_cm_to_bl_bone_space(x):
324def convert_cm_to_bl_bone_space(x):
325    if type(x) == mathutils.Quaternion:
326        raise TypeError('Quaternion space conversions not supported')
327    else:
328        return mul(CM_TO_BL_BONE_SPACE_MAT4, x)
def convert_bl_to_cm_bone_space(x):
329def convert_bl_to_cm_bone_space(x):
330    if type(x) == mathutils.Quaternion:
331        raise TypeError('Quaternion space conversions not supported')
332    else:
333        return mul(BL_TO_CM_BONE_SPACE_MAT4, x)
CM_TO_BL_WIDE_SLIDER_SPACE_MAT4 = Matrix(((0.0, 0.0, 1.0, 0.0), (1.0, 0.0, 0.0, 0.0), (0.0, -1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_WIDE_SLIDER_SPACE_MAT4 = Matrix(((-0.0, 1.0, -0.0, 0.0), (0.0, -0.0, -1.0, -0.0), (1.0, 0.0, -0.0, 0.0), (0.0, -0.0, 0.0, 1.0)))
CM_TO_BL_WIDE_SLIDER_SPACE_QUAT = Quaternion((0.5, 0.5, -0.5, -0.5))
BL_TO_CM_WIDE_SLIDER_SPACE_QUAT = Quaternion((0.5, -0.5, 0.5, 0.5))
def convert_cm_to_bl_wide_slider_space(x):
343def convert_cm_to_bl_wide_slider_space(x):
344    if type(x) == mathutils.Quaternion:
345        raise TypeError('Quaternion space conversions not supported')
346    else:
347        return mul(CM_TO_BL_WIDE_SLIDER_SPACE_MAT4, x)
def convert_bl_to_cm_wide_slider_space(x):
348def convert_bl_to_cm_wide_slider_space(x):
349    if type(x) == mathutils.Quaternion:
350        raise TypeError('Quaternion space conversions not supported')
351    else:
352        return mul(BL_TO_CM_WIDE_SLIDER_SPACE_MAT4, x)
CM_TO_BL_SLIDER_SPACE_MAT4 = Matrix(((0.0, 0.0, 1.0, 0.0), (1.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 1.0)))
BL_TO_CM_SLIDER_SPACE_MAT4 = Matrix(((0.0, 1.0, 0.0, -0.0), (-0.0, 0.0, 1.0, 0.0), (1.0, -0.0, 0.0, -0.0), (-0.0, 0.0, -0.0, 1.0)))
CM_TO_BL_SLIDER_SPACE_QUAT = Quaternion((0.5, 0.5, 0.5, 0.5))
BL_TO_CM_SLIDER_SPACE_QUAT = Quaternion((0.5, -0.5, -0.5, -0.5))
def convert_cm_to_bl_slider_space(x):
359def convert_cm_to_bl_slider_space(x):
360    if type(x) == mathutils.Quaternion:
361        raise TypeError('Quaternion space conversions not supported')
362    else:
363        return mul(CM_TO_BL_SLIDER_SPACE_MAT4, x)
def convert_bl_to_cm_slider_space(x):
364def convert_bl_to_cm_slider_space(x):
365    if type(x) == mathutils.Quaternion:
366        raise TypeError('Quaternion space conversions not supported')
367    else:
368        return mul(BL_TO_CM_SLIDER_SPACE_MAT4, x)
def set_bone_matrix(bone, mat):
372def set_bone_matrix(bone, mat):
373    bone.matrix = mat.copy()
374    #axis, angle = mat.to_quaternion().to_axis_angle()
375    #bone.roll = angle
376    if not IS_LEGACY and isinstance(bone, bpy.types.EditBone):
377        #print("Bone align_roll: ", (mat[0][0],mat[1][0],mat[2][0]))
378        bone.align_roll((mat[0][2],mat[1][2],mat[2][2]))
379    #print("bone: ", bone.matrix)
380    #print("mat:  ", mat)
BL28_TO_LEGACY_ICON = {'ADD': 'ZOOMIN', 'REMOVE': 'ZOOMOUT', 'FILE_NEW': 'NEW', 'SHADING_BBOX': 'BBOX', 'SHADING_TEXTURE': 'POTATO', 'SHADING_RENDERED': 'SMOOTH', 'SHADING_SOLID': 'SOLID', 'SHADING_WIRE': 'WIRE', 'XRAY': 'ORTHO', 'PROPERTIES': 'BUTS', 'IMAGE': 'IMAGE_COL', 'OUTLINER': 'OOPS', 'GRAPH': 'IPO', 'PREFERENCES': 'SCRIPTWIN', 'PIVOT_CURSOR': 'CURSOR', 'PIVOT_INDIVIDUAL': 'ROTATECOLLECTION', 'PIVOT_MEDIAN': 'ROTATECENTER', 'PIVOT_ACTIVE': 'ROTACTIVE', 'WINDOW': 'FULLSCREEN', 'LIGHT': 'LAMP', 'LIGHT_DATA': 'LAMP_DATA', 'OUTLINER_OB_LIGHT': 'OUTLINER_OB_LAMP', 'OUTLINER_DATA_LIGHT': 'OUTLINER_DATA_LAMP', 'LIGHT_POINT': 'LAMP_POINT', 'LIGHT_SUN': 'LAMP_SUN', 'LIGHT_SPOT': 'LAMP_SPOT', 'LIGHT_HEMI': 'LAMP_HEMI', 'LIGHT_AREA': 'LAMP_AREA', 'HIDE_OFF': 'VISIBLE_IPO_ON', 'HIDE_ON': 'VISIBLE_IPO_OFF', 'ALEMBIC': None, 'ALIGN_BOTTOM': None, 'ALIGN_CENTER': None, 'ALIGN_FLUSH': None, 'ALIGN_JUSTIFY': None, 'ALIGN_LEFT': None, 'ALIGN_MIDDLE': None, 'ALIGN_RIGHT': None, 'ALIGN_TOP': None, 'ASSET_MANAGER': None, 'BOLD': None, 'DECORATE': None, 'DECORATE_ANIMATE': None, 'DECORATE_DRIVER': None, 'DECORATE_KEYFRAME': None, 'DECORATE_LIBRARY_OVERRIDE': None, 'DECORATE_LINKED': None, 'DECORATE_LOCKED': None, 'DECORATE_OVERRIDE': None, 'DECORATE_UNLOCKED': None, 'DRIVER_DISTANCE': None, 'DRIVER_ROTATIONAL_DIFFERENCE': None, 'DRIVER_TRANSFORM': None, 'DUPLICATE': None, 'FACE_MAPS': None, 'FAKE_USER_OFF': None, 'FAKE_USER_ON': None, 'GP_MULTIFRAME_EDITING': None, 'GP_ONLY_DSELECTED': None, 'GP_SELECT_POINTS': None, 'GP_SELECT_STROKES': None, 'GREASEPENCIL': None, 'HEART': None, 'ITALIC': None, 'LIBRARY_DATA_OVERRIDE': None, 'LIGHTPROBE_CUBEMAP': None, 'LIGHTPROBE_GRID': None, 'LIGHTPROBE_PLANAR': None, 'LINE_DATA': None, 'MATCLOTH': None, 'MATFLUID': None, 'MATSHADERBALL': None, 'MOD OPACITY': None, 'MOD_HUE_SATURATION': None, 'MOD_INSTANCE': None, 'MOD_NOISE': None, 'MOD_OFFSET': None, 'MOD_PARTICLE_INSTANCE': None, 'MOD_SIMPLIFY': None, 'MOD_THICKNESS': None, 'MOD_TIME': None, 'MODIFIER_OFF': None, 'MODIFIER_ON': None, 'MOUSE_LMB': None, 'MOUSE_LMB_DRAG': None, 'MOUSE_MMB': None, 'MOUSE_MMB_DRAG': None, 'MOUSE_MOVE': None, 'MOUSE_RMB': None, 'MOUSE_RMB_DRAG': None, 'NORMALS_FACE': None, 'NORMALS_VERTEX': 'MATCAP_23', 'NORMALS_VERTEX_FACE': 'MATCAP_23', 'OBJECT_ORIGIN': None, 'ONIONSKIN_OFF': None, 'ONIONSKIN_ON': None, 'ORIENTATION_GIMBAL': None, 'ORIENTATION_GLOBAL': None, 'ORIENTATION_LOCAL': None, 'ORIENTATION_NORMAL': None, 'ORIENTATION_VIEW': None, 'OUTLINER_DATA_GREASEPENCIL': None, 'OUTLINER_OB_IMAGE': None, 'OUTLINER_OB_LIGHTPROBE': None, 'OVERLAY': None, 'PRESET': None, 'PRESET_NEW': None, 'SEALED': None, 'SETTINGS': None, 'SHADERFX': None, 'SMALL_CAPS': None, 'SYSTEM': None, 'THREE_DOTS': None, 'TOOL_SETTINGS': None, 'TRACKING': None}
LEGACY_TO_BL28_ICON = {'ZOOMIN': 'ADD', 'ZOOMOUT': 'REMOVE', 'NEW': 'FILE_NEW', 'BBOX': 'SHADING_BBOX', 'POTATO': 'SHADING_TEXTURE', 'SMOOTH': 'SHADING_RENDERED', 'SOLID': 'SHADING_SOLID', 'WIRE': 'SHADING_WIRE', 'ORTHO': 'XRAY', 'BUTS': 'PROPERTIES', 'IMAGE_COL': 'IMAGE', 'OOPS': 'OUTLINER', 'IPO': 'GRAPH', 'SCRIPTWIN': 'PREFERENCES', 'CURSOR': 'PIVOT_CURSOR', 'ROTATECOLLECTION': 'PIVOT_INDIVIDUAL', 'ROTATECENTER': 'PIVOT_MEDIAN', 'ROTACTIVE': 'PIVOT_ACTIVE', 'FULLSCREEN': 'WINDOW', 'LAMP': 'LIGHT', 'LAMP_DATA': 'LIGHT_DATA', 'OUTLINER_OB_LAMP': 'OUTLINER_OB_LIGHT', 'OUTLINER_DATA_LAMP': 'OUTLINER_DATA_LIGHT', 'LAMP_POINT': 'LIGHT_POINT', 'LAMP_SUN': 'LIGHT_SUN', 'LAMP_SPOT': 'LIGHT_SPOT', 'LAMP_HEMI': 'LIGHT_HEMI', 'LAMP_AREA': 'LIGHT_AREA', 'VISIBLE_IPO_ON': 'HIDE_OFF', 'VISIBLE_IPO_OFF': 'HIDE_ON', 'LINK_AREA': 'LINKED', 'PLUG': 'PLUGIN', 'EDIT': None, 'GAME': None, 'RADIO': None, 'DOTSUP': 'DOT', 'DOTSDOWN': 'DOT', 'LINK': 'LAYER_USED', 'INLINK': None, 'GO_LEFT': None, 'TEMPERATURE': None, 'SNAP_SURFACE': None, 'MANIPUL': None, 'BORDER_LASSO': None, 'MAN_TRANS': None, 'MAN_ROT': None, 'MAN_SCALE': None, 'RENDER_REGION': None, 'RECOVER_AUTO': None, 'SAVE_COPY': None, 'OPEN_RECENT': None, 'LOAD_FACTORY': None, 'ALIGN': None, 'SPACE2': None, 'ROTATE': None, 'SAVE_AS': None, 'BORDER_RECT': None}
def icon(key):
582def icon(key):
583    if IS_LEGACY:
584        # 対応アイコンがdictにない場合はNONEとする
585        return BL28_TO_LEGACY_ICON.get(key, key) or 'NONE'
586    else:
587        return LEGACY_TO_BL28_ICON.get(key, key) or 'NONE'
588        
589    return key
def region_type():
592def region_type():
593    if IS_LEGACY:
594        return 'TOOLS'
595
596    return 'UI'
def pref_type():
599def pref_type():
600    if IS_LEGACY:
601        return 'USER_PREFERENCES'
602
603    return 'PREFERENCES'
def get_prefs(context):
606def get_prefs(context):
607    if IS_LEGACY:
608        return context.user_preferences
609
610    return context.preferences
def get_system(context):
613def get_system(context):
614    if IS_LEGACY:
615        return get_prefs(context).system
616
617    return get_prefs(context).view
def get_tex_image(context, node_name=None):
620def get_tex_image(context, node_name=None):
621    if IS_LEGACY:
622        if hasattr(context, 'texture'):
623            tex = context.texture
624            if tex:
625                return tex.image
626    else:
627        mate = context.material
628        if mate and mate.use_nodes:
629            node = mate.node_tree.nodes.get(node_name)
630            if node and node.type == 'TEX_IMAGE':
631                return node.image
632
633    return None
BL29_TO_BL28_SUBTYPE = {'FILEPATH': 'FILE_PATH', 'DIRPATH': 'DIR_PATH', 'FILENAME': None, 'BYTESTRING': None, 'PASSWORD': None, 'DISTANCE_CAMERA': 'DISTANCE', 'POWER': None, 'TEMPERATURE': None, 'VELOCITY': 'XYZ', 'ACCELERATION': 'XYZ', 'AXISANGLE': 'XYZ', 'XYZ_LENGTH': 'XYZ', 'COORDS': 'COORDINATES', 'LAYER_MEMBER': 'LAYER_MEMBERSHIP'}
def subtype(key):
676def subtype(key):
677    if bpy.app.version < (2, 91):
678        return BL29_TO_BL28_SUBTYPE.get(key, key) or 'NONE'
679    return key
BL29_TO_LEGACY_UNIT = {'MASS': None, 'POWER': None, 'TEMPERATURE': None}
BL29_TO_BL28_UNIT = {'TEMPERATURE': None}
def unit(key):
697def unit(key):
698    if IS_LEGACY:
699        return BL29_TO_LEGACY_UNIT.get(key, key) or 'NONE'
700    elif bpy.app.version < (2, 91):
701        return BL29_TO_BL28_UNIT.get(key, key) or 'NONE'
702    return key